package com.zut.view;

import com.zut.entity.Classes;
import com.zut.entity.Student;
import com.zut.service.ClassesService;
import com.zut.service.StudentService;
import com.zut.service.impl.ClassesServiceImpl;
import com.zut.service.impl.StudentServiceImpl;

import java.util.*;

/**
 * 学生信息操作界面
 */
public class StudentView {

    //扫描器对象
    private Scanner sc = new Scanner(System.in);

    //学生业务对象
    private StudentService stuService = new StudentServiceImpl();

    //班级业务对象
    private ClassesService cls = new ClassesServiceImpl();

    //接收班级编号的集合
    private List<Integer> clsIds;

    //接收学生编号集合
    private List<String> stuIds;


    /**
     * 主菜单
     */

    public void studentMainPage(){
        while (true){
            System.out.println("+++++++学生信息管理+++++++");
            System.out.println("请选择功能:1、添加学生 2、查询所有学生 3、根据姓名模糊查询 4、根据班级查询 5、修改班级 6、删除学生 0、退出系统");

            //接收输入的选项
            String num = sc.nextLine();
            switch (num){
                case "1":
                    addStudentPage();
                    break;
                case "2":
                    showAllStudentsPage();
                    break;
                case "3":
                    findStudentsLikeNamePage();
                    break;
                case "4":
                    findStudentsByClassNamePage();
                    break;
                case "5":
                    updateStudentClassPage();
                    break;
                case "6":
                    deleteStudentPage();
                    break;
                case "0":

                    return;
                default:
                    System.out.println("该功能暂未开放，请重新选择");

            }

        }
    }

    /**
     * 删除学生
     */
    private void deleteStudentPage() {
        showAllStudentsPage();

        System.out.println("请选择要删除的学生编号:");
        String stuId = sc.nextLine();

        //调用业务方法
        boolean bl = stuService.deleteStudent(stuId);

        //提示
        System.out.println(bl?"删除成功":"学生不存在");

    }

    /**
     * 修改班级
     */
    private void updateStudentClassPage() {
        /*******************选择学生*******************/
        showAllStudentsPage();

        String stuId = null;
        while (true){
            System.out.println("请输入需要调班的学生编号:");
            stuId = sc.nextLine();

            if(stuIds.contains(stuId)){

                break;
            }else{

                System.out.println("学生编号有误，请重新选择");
            }
        }




        /*******************选择班级*******************/
        //获取班级list集合
        List<Classes> list = cls.findAllClasses();

        //创建一个备份班级编号的list
        clsIds = new ArrayList<>();

        //展示班级信息
        if(list.size()==0){
            System.out.println("暂无班级信息");
            return;
        }

        System.out.println("班级信息如下:");
        for (Classes classes : list) {
            System.out.println("班级编号:"+classes.getId()+"\t"+classes.getName());
            //备份班级编号
            clsIds.add(classes.getId());
        }
        String clsId=null;

        while(true) {
            System.out.println("请选择班级:");
            clsId = sc.nextLine();

            //判断班级编号是否正确
            if (clsIds.contains(Integer.valueOf(clsId))) {
                break;
            } else {
                System.out.println("班级不存在，请重新选择");
            }
        }


        //执行修改的业务方法
        stuService.updateClassesById(stuId,clsId);

        System.out.println("修改完成");

    }

    /**
     * 根据班级查询学生
     */
    private void findStudentsByClassNamePage() {

        System.out.println("请输入班级名称:");
        String className = sc.nextLine();

        //调用业务方法查询
        List<Map<String,Object>> list = stuService.findStudentsByClassName(className);

        //展示
        if(list.size()==0){
            System.out.println("未查询到学生信息");
            return;
        }

        //有学生，遍历
        for (Map<String, Object> map : list) {
            System.out.println("编号:"+map.get("id")+"\t姓名:"+map.get("name")+"\t性别:"+map.get("gender")+"\t班级:"+map.get("className"));
        }



    }


    /**
     * 模糊查询界面
     */
    private void findStudentsLikeNamePage() {
        System.out.println("请输入学生姓名:");
        String name = sc.nextLine();

        //调用业务方法
        List<Map<String,Object>> list = stuService.findStudentsLikeName(name);

        //展示
        if(list.size()==0){
            System.out.println("未查询到学生信息");
            return;
        }

        //有学生，遍历
        for (Map<String, Object> map : list) {
            System.out.println("编号:"+map.get("id")+"\t姓名:"+map.get("name")+"\t性别:"+map.get("gender")+"\t班级:"+map.get("className"));
        }


    }

    /**
     * 学生信息全部查询的界面
     */
    private void showAllStudentsPage() {

        //创建一个接收学生id的集合
        stuIds = new ArrayList<>();

        //调用业务方法，查询所有学生
        List<Map<String,Object>> list = stuService.findAllStudent();

        //遍历展示集合
        if(list.size()==0){
            System.out.println("暂无学生信息，请录入");
            return;
        }

        //有学生，遍历
        for (Map<String, Object> map : list) {

            System.out.println("编号:"+map.get("id")+"\t姓名:"+map.get("name")+"\t性别:"+map.get("gender")+"\t班级:"+map.get("className"));

            stuIds.add((String)map.get("id"));
        }

    }

    /**
     * 添加学生的界面
     */
    private void addStudentPage() {
        System.out.println("**************添加学生*********************");

        //创建一个学生对象，接收信息
        Student stu = new Student();

        System.out.println("请输入学生姓名:");
        stu.setName(sc.nextLine());

        while (true){
            System.out.println("请输入性别:(男/女)");
            String gender = sc.nextLine();

            if("男".equals(gender) || "女".equals(gender)){//性别输入正确
                stu.setGender(gender);
                break;
            }else{
                System.out.println("性别输入有误，请重新输入");
            }
        }

        //电话号码
        while(true){

            System.out.println("请输入手机号:");
            String phoneNum = sc.nextLine();

            if(phoneNum.matches("^1[35789][0-9]{9}$")){
                stu.setPhoneNum(phoneNum);
                break;
            }else{
                System.out.println("电话号码不正确");
            }

        }

        //地址
        System.out.println("请输入家庭住址:");
        stu.setAddress(sc.nextLine());

        //密码，用手机后6位作为密码
        String pwd = stu.getPhoneNum().substring(5);
        stu.setPassword(pwd);

        stu.setEnrollmentTime(new Date());

        //选择班级
        List<Classes> list = cls.findAllClasses();
        System.out.println("班级情况如下:");

        if(list.size()==0){
            System.out.println("暂无班级，请添加班级后，再录入学生信息");
            return;
        }


        //展示班级内容
        clsIds = new ArrayList<>();
        for (Classes classes : list) {
            System.out.println("班级编号:"+classes.getId()+"\t班级名称:"+classes.getName());
            clsIds.add(classes.getId());
        }

        while(true) {
            System.out.println("请选择学生所属班级：");
            String clsId = sc.nextLine();

            if (clsIds.contains(Integer.valueOf(clsId))) { //班级编号输入正确
                stu.setClassId(Integer.valueOf(clsId));  //把班级编号绑定到学生对象
                break;
            } else {
                System.out.println("班级不存在，请重新选择");
            }
        }

        //调用添加的业务方法
        stuService.addStudent(stu);

        System.out.println("添加成功");


    }

    /**
     * 修改学生密码
     * @param student
     */
    public void updatePassword(Student student) {

       while (true){
           System.out.println("请输入原密码:");
           String oldPwd = sc.nextLine();
           if(oldPwd.equals(student.getPassword())){ //原密码正确

               System.out.println("输入新密码");
               String newPwd = sc.nextLine();

               //调用修改业务方法
               stuService.updatePassword(student.getId(),newPwd);

               System.out.println("密码修改完成，下次请以新密码登录");

               return;
           }else{
               System.out.println("原密码错误，请重新输入");
           }
       }
    }

    /**
     * 修改手机号
     * @param id
     */
    public void updatePhoneNum(String id) {

        while (true){

            System.out.println("请输入新的手机号:");
            String newPhoneNum = sc.nextLine();

            //格式校验
            if(newPhoneNum.matches("^1[356789][0-9]{9}$")){

                //调用业务方法
                stuService.updatePhoneNum(id,newPhoneNum);

                System.out.println("修改完成");
                return;
            }else{

                System.out.println("手机号格式不正确，请重新输入");
            }


        }

    }
    public void updateAddress(String id) {
        System.out.println("请输入你的新家庭住址");
        String newAddress = sc.nextLine();
        while(true){
            stuService.updateAddress(id,newAddress);
            System.out.println("修改完成");
            return;
        }
    }


}



